package cn.blnp.net.flowable.task.script;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * <h3>脚本任务</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/5/13 14:09
 */
@Slf4j
@SpringBootTest
public class ScriptTaskTest {

    /**
     *  <p>
     *      脚本任务是一种自动执行的活动。当流程流转到脚本任务时，会执行相应的脚本，然后继续流转。代码定义格式如下所示：
     *  <pre>
     *      {@code
     *          <scriptTask id="scriptTask1" name="脚本任务" scriptFormat="groovy">
     *              <script>
     *                  sum = 0
     *                  for (i in inputArray) {
     *                      sum += i
     *                  }
     *              </script>
     *          </scriptTask>
     *      }
     *  </pre>
     *  &emsp;&emsp;其中，scriptFormat属性表示脚本格式，其值必须兼容JSR-223（Java平台的脚本语言）。Flowable支持3种脚本任务类型：javascript、groovy和juel。默认情
     *  况下，javascript已经包含在JDK中，因此无须额外的依赖。如果想使用其他兼容JSR-223的脚本引擎，需要把对应的JAR包添加到classpath下，并使用合适的名称。例如，
     *  Flowable单元测试经常使用groovy，因为其语法与Java十分类似。脚本任务通过script子元素配置需要执行的脚本。
     *  </p>
     **/
    @Test
    public void testBase() {

    }

    /**
     *  <h2>脚本任务中流程变量的使用</h2>
     *  <hr/>
     *  <p>
     *      当流程流转到脚本任务时，所有的流程变量都可以在脚本中使用。脚本任务使用的inputArray，实际上就是一个流程变量（一个integer数组）。默认情况下，
     *  变量不会自动保存。如果要在脚本中自动保存变量，可以将scriptTask的flowable: autoStoreVariables属性值设置为true，示例代码如下：
     *  <pre>
     *      {@code
     *          <scriptTask id="scriptTask1" name="脚本任务" scriptFormat="groovy" flowable:autoStoreVariables="true">
     *              <script>
     *                  sum = 0
     *                  for (i in inputArray) {
     *                      sum += i
     *                  }
     *              </script>
     *          </scriptTask>
     *      }
     *  </pre>
     *  &emsp;&emsp;其中，flowable:autoStoreVariables属性的默认值为false，表示脚本声明的所有变量将只在脚本执行期间有效。当将其设置为true时，Flowable会自动保存任何
     *  在脚本中定义的变量，如这里的sum。然而并不建议这样做，因为这样做对于流程变量的控制不是很友好。在脚本中设置流程变量，建议调用 execution.setVariable ("variableName", variableValue)
     *  方法实现，例如：
     *  <pre>
     *      {@code
     *          <scriptTask id="scriptTask1" name="脚本任务" scriptFormat="groovy">
     *              <script>
     *                  sum = 0
     *                  for (i in inputArray) {
     *                      sum += i
     *                  }
     *                  execution.setVariable("sum", sum)
     *              </script>
     *          </scriptTask>
     *      }
     *  </pre>
     *  </p>
     **/
    @Test
    public void testVariables() {

    }

    /**
     *  <h2>脚本任务的执行结果</h2>
     *  <hr/>
     *  <p>
     *      脚本任务的返回值可以通过为脚本任务定义的flowable:resultVariable属性设置为流程变量。它可以是新的流程变量，也可以是已经存在的流程变量。如果指定为已存在的流程变量，
     *  则流程变量值会被脚本执行结果值覆盖。如果不指定返回变量名，则脚本执行结果值将被忽略。下面看一个示例：
     *  <pre>
     *      {@code
     *          <scriptTask id="scriptTask1" name="脚本任务" scriptFormat="juel" flowable:resultVariable="totalAmount">
     *              <script>${unitPrice * quantity}</script>
     *          </scriptTask>
     *      }
     *  </pre>
     *  </p>
     **/
    @Test
    public void testRes() {

    }
}
